#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>

int main(int argc, char* argv[]) {
    // 检查命令行参数
    if (argc != 3) {
        std::cerr << "使用方法: " << argv[0] << " <文件1> <文件2>" << std::endl;
        return 1;
    }

    std::string file1 = argv[1];
    std::string file2 = argv[2];

    // 以二进制模式打开文件
    std::ifstream f1(file1, std::ios::binary | std::ios::ate);
    std::ifstream f2(file2, std::ios::binary | std::ios::ate);

    // 检查文件是否成功打开
    if (!f1) {
        std::cerr << "无法打开文件: " << file1 << std::endl;
        return 1;
    }
    if (!f2) {
        std::cerr << "无法打开文件: " << file2 << std::endl;
        return 1;
    }

    // 获取文件大小
    std::streampos size1 = f1.tellg();
    std::streampos size2 = f2.tellg();

    // 重置文件指针到开始位置
    f1.seekg(0, std::ios::beg);
    f2.seekg(0, std::ios::beg);

    // 输出文件大小信息
    std::cout << "文件1大小: " << size1 << " 字节" << std::endl;
    std::cout << "文件2大小: " << size2 << " 字节" << std::endl;
    
    if (size1 != size2) {
        std::cout << "文件大小不同!" << std::endl;
    }

    // 比较文件内容（以较小的文件大小为准）
    const size_t compareSize = static_cast<size_t>(std::min(size1, size2));
    bool filesIdentical = true;
    size_t firstDiffPos = 0;
    char byte1, byte2;

    // 使用128MB缓冲区
    const size_t bufferSize = 128 * 1024 * 1024; // 128MB
    std::vector<char> buffer1(bufferSize);
    std::vector<char> buffer2(bufferSize);
    
    size_t pos = 0;
    char* ptr1 = nullptr;
    char* ptr2 = nullptr;
    char* end = nullptr;
    
    // 使用指针而不是数组下标进行比较
    while (pos < compareSize) {
        size_t currentReadSize = std::min(bufferSize, compareSize - pos);
        
        f1.read(buffer1.data(), currentReadSize);
        f2.read(buffer2.data(), currentReadSize);
        
        // 使用指针进行字节比较
        ptr1 = buffer1.data();
        ptr2 = buffer2.data();
        end = ptr1 + currentReadSize;
        
        // 在缓冲区中查找第一个不同的字节
        while (ptr1 < end) {
            if (*ptr1 != *ptr2) {
                firstDiffPos = pos + (ptr1 - buffer1.data());
                filesIdentical = false;
                // 保存不同的字节值用于输出
                byte1 = *ptr1;
                byte2 = *ptr2;
                break;
            }
            ++ptr1;
            ++ptr2;
        }
        
        // 如果找到不同的字节，跳出外层循环
        if (!filesIdentical) {
            break;
        }
        
        pos += currentReadSize;
    }

    // 关闭文件
    f1.close();
    f2.close();

    // 输出比较结果
    if (filesIdentical && size1 == size2) {
        std::cout << "文件完全相同!" << std::endl;
    } else if (filesIdentical && size1 != size2) {
        std::cout << "文件内容在前" << compareSize << "字节相同，但大小不同!" << std::endl;
    } else {
        std::cout << "文件在第" << firstDiffPos << "字节(0索引)开始不同" << std::endl;
        std::cout << "文件1的字节: 0x" << std::setw(2) << std::setfill('0') << std::hex 
                  << static_cast<int>(static_cast<unsigned char>(byte1)) << std::dec << std::endl;
        std::cout << "文件2的字节: 0x" << std::setw(2) << std::setfill('0') << std::hex 
                  << static_cast<int>(static_cast<unsigned char>(byte2)) << std::dec << std::endl;
    }

    return 0;
}